#include <gtest/gtest.h>
#include "ArrayStack.h"  // 假设你的栈类在这个头文件中

// 测试栈基本操作
TEST(ArrayStackTest, BasicOperations) {
    ArrayStack s(5);  // 创建一个容量为5的栈

    // 测试栈是否为空
    EXPECT_TRUE(s.isEmpty());

    // 测试push操作
    s.push(10);
    s.push(20);
    s.push(30);
    s.push(40);
    s.push(50);

    EXPECT_FALSE(s.isEmpty());
    EXPECT_EQ(s.size(), 5);  // 栈中有5个元素

    // 测试peek操作
    EXPECT_EQ(s.peek(), 50);  // 栈顶是50

    // 测试栈已满的情况
    EXPECT_TRUE(s.isFull());

    // 测试pop操作
    s.pop();
    EXPECT_EQ(s.peek(), 40);  // 栈顶应该是40
    EXPECT_EQ(s.size(), 4);   // 栈中剩下4个元素

    // 测试继续pop直到栈空
    s.pop();
    s.pop();
    s.pop();
    s.pop();
    EXPECT_TRUE(s.isEmpty());
    EXPECT_EQ(s.size(), 0);  // 栈应为空
}

// 测试栈溢出情况（大数据量测试）
TEST(ArrayStackTest, OverflowTest) {
    const int large_size = 1000000;  // 大数据量

    ArrayStack s(large_size);  // 创建一个容量为 large_size 的栈

    // 测试大规模 push 操作
    for (int i = 0; i < large_size; ++i) {
        s.push(i);
    }

    EXPECT_EQ(s.size(), large_size);  // 确保栈有 large_size 个元素

    // 测试栈顶元素
    EXPECT_EQ(s.peek(), large_size - 1);  // 栈顶元素应为 large_size-1

    // 测试大规模 pop 操作
    for (int i = 0; i < large_size; ++i) {
        s.pop();
    }

    EXPECT_TRUE(s.isEmpty());  // 栈应为空
    EXPECT_EQ(s.size(), 0);    // 栈应为空
}

// 测试栈溢出
TEST(ArrayStackTest, StackOverflowTest) {
    const int small_size = 3;  // 小栈容量
    ArrayStack s(small_size);

    // 插入数据直到栈满
    s.push(1);
    s.push(2);
    s.push(3);

    // 测试栈满时的行为
    EXPECT_TRUE(s.isFull());

    // 尝试向满栈推送数据，应该不会成功
    s.push(4);  // 栈满，应该没有反应或抛出异常

    EXPECT_EQ(s.size(), 3);  // 栈的大小仍为3
    EXPECT_EQ(s.peek(), 3);  // 栈顶元素应为3
}

// 测试栈空时pop和peek操作
TEST(ArrayStackTest, EmptyStackTest) {
    ArrayStack s(5);

    // 测试栈为空时pop操作
    EXPECT_TRUE(s.isEmpty());
    s.pop();  // 空栈，不应做任何操作
    EXPECT_TRUE(s.isEmpty());  // 栈依然为空

    // 测试栈为空时peek操作
    EXPECT_EQ(s.peek(), -1);  // 栈空时，peek应返回-1或适当的错误值
}

int main() {
    ::testing::InitGoogleTest();
    return RUN_ALL_TESTS();
}